package main

import "fmt"

/*
1.而面向对象的可复用设计的第一块基石，便是所谓的”开-闭“原则（Open-Closed Principle,常缩写为OCP）。虽然，go不是面向对象语言，但是也可以模拟实现这个原则。对扩展是开放的，对修改是关闭的
*/

//定义一个宠物接口Pet
type Pet interface {
	//该接口有吃和睡两个方法
	eat()
	sleep()
}

//定义Dog结构体
type Dog struct {
	name string
	age  int
}

//dog实现接口方法
func (dog Dog) eat() {
	fmt.Println("dog eat...........")
}

func (dog Dog) sleep() {
	fmt.Println("dog sleep...........")
}

//定义一个cat的结构体
type Cat struct {
	name string
	age  int
}

//Cat实现接口方法
func (cat Cat) eat() {
	fmt.Println("cat eat................")
}
func (cat Cat) sleep() {
	fmt.Println("cat sleep............")
}

//定义个Person结构体
type Person struct {
	name string
}

//为person添加一个宠物的方法
func (per Person) care(pet Pet) {
	pet.eat()
	pet.sleep()
}

func main() {
	dog := Dog{}
	cat := Cat{}
	per := Person{}

	per.care(dog)
	per.care(cat)
}
